//===========================================================================//
// File:	origin.cc                                                        //
// Contents: Implementation details for the position class                   //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#include "StuffHeaders.hpp"

const Origin3D
	Origin3D::Identity(
		Point3D(0.0f, 0.0f, 0.0f),
		UnitQuaternion(0.0f, 0.0f, 0.0f, 1.0f)
	);

//
//###########################################################################
//###########################################################################
//
Origin3D&
	Origin3D::operator=(const Origin3D &origin)
{
	Check_Pointer(this);
	Check_Object(&origin);

	angularPosition = origin.angularPosition;
	linearPosition = origin.linearPosition;
	return *this;
}

//
//###########################################################################
//###########################################################################
//
Origin3D&
	Origin3D::operator=(const LinearMatrix4D &matrix)
{
	Check_Pointer(this);
	Check_Object(&matrix);

	angularPosition = matrix;
	linearPosition = matrix;
	return *this;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
	Stuff::Close_Enough(
		const Origin3D &a1,
		const Origin3D &a2,
		Scalar e
	)
{
	Check_Object(&a1);
	Check_Object(&a2);
	return
		Close_Enough(a1.linearPosition, a2.linearPosition, e)
		 && Close_Enough(a1.angularPosition, a2.angularPosition, e);
}

#if 0
//
//###########################################################################
//###########################################################################
//
Origin3D&
	Origin3D::AddScaled(
		const Origin3D& source,
		const Motion& delta,
		Scalar t
	)
{
	Check_Pointer(this);
	Check_Object(&source);
	Check_Object(&delta);
	Verify(t >= 0.0f);

	linearPosition.AddScaled(source.linearPosition, delta.linearMotion, t);
	angularPosition.AddScaled(source.angularPosition, delta.angularMotion, t);
	return *this;
}
#endif

//
//#############################################################################
//#############################################################################
//
Origin3D&
	Origin3D::Lerp(
		const Origin3D &start,
		const Origin3D &end,
		Scalar t
	)
{
	Check_Pointer(this);
	Check_Object(&start);
	Check_Object(&end);

	linearPosition.Lerp(start.linearPosition, end.linearPosition, t);
	angularPosition.Lerp(start.angularPosition, end.angularPosition, t);
	Check_Object(this);
   return *this;
}

//
//###########################################################################
//###########################################################################
//
#if !defined(Spew)
	void
		Spew(
			const char* group,
			const Origin3D& origin
		)
	{
		SPEW((group, "{+"));
		Spew(group, origin.linearPosition);
		SPEW((group, ",+"));
		Spew(group, origin.angularPosition);
		SPEW((group, "}+"));
	}
#endif

//
//###########################################################################
//###########################################################################
//
void
	Origin3D::TestInstance() const
{
	Check_Object(&angularPosition);
}
